﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void testBit()
{
	//1.按位取反~，对补码取反；
	int number = 2;//0000 0010
	//3.0000 0010-->1111 1101，补码取反后为负数，负数使用补码存储（先取反码，再加1）。
	//符号位不变，先得到反码：1111 1101-11=1111 1100，最后得到原码1000 0011，即为-3；
	printf("2.对数字2进行按位取反，则~number为：%d\n", ~number);//-3

	//4.位与&；1&0=0；1&1=1；0&0=0；
	// 10011
	//&00010
	// 00010
	number = 335;
	if ((number & 1) == 0)
	{
		printf("5.%d是偶数！\n", number);
	}
	else
	{
		printf("6.%d是奇数！\n", number);//6.335是奇数！
	}
	//8.清零操作，和下面一行等同；
	//number = number & 0;
	number &= 0;
	printf("7.将变量number清零，则number为：%d\n", number);//0

	//9.位或|；有1为1，无1为0；
	// 1101
	//|0011
	// 1111
	int num1 = 5;//101
	int num2 = 3;//011		111=7
	printf("10.num1|num2的结果为：%d\n", num1 | num2);//7

	//11.位抑或^，相等为0，不相等为1；
	//A: 110
	//B: 100
	//C: 010    A^B=C   C^B=A   C^A=B  -->  A^B^B=A
	printf("12.输出未交换之前的num1和num2：%d   %d\n", num1, num2);//5   3
#if 0
	int temp = num1;
	num1 = num2;
	num2 = temp;
#endif
	num1 = num1 ^ num2;//A^B=C
	num2 = num1 ^ num2;//C^B=A
	num1 = num1 ^ num2;//C^A=B

	printf("13.使用位抑或^来交换num1和num2，则：%d   %d\n", num1, num2);//3   5

	//14.移位运算符；n<<1，n左移1位，即n*2；
	//001<<1 = 010 =2
	//010<<1 = 100 =4
	//001<<2 = 100 =4   n移动两位，即n乘2的2次方；
		//左移运算符，左移几位就相当于乘以2的几次方；
	number = 20;
	printf("15.将数字20左移两位，则结果为：%d\n", number << 2);//80
	//17.右移运算符，右移几位就相当于除以2的几次方；number>>=1  <-->  number = number>>1;
	printf("16.将数字20右移一位，则number为：%d\n", number >>= 1);//20/2^1=10
}

//main201：位操作
int main201()
{
	testBit();

	system("pause");
	return EXIT_SUCCESS;
}